- web6047 - (2021/09/10(金) 現在、システム調整中のため、一部の表示がおかしいかもしれません)

[横幅 1024px以下]

web6047 2022年 1

プ ログラミングやRPG(作るほう)が好きな人の日記



個人的な趣味(プログラミング、イラスト、電子回路)のページです。

自身のパソコンのやりすぎに対する管理の表の公開、

最近見ているアニメや映画と 買い物の簡易なリスト、

それから日記を掲載しています。日記が主体です。


パソコン使用時間管理の公開:   パソコン使用時間管理

この表は、このウェブページの管理人のパソコンの使用時間を管理・制限するためのものです。

このようなプライベートなことを公開して、ちょっと恥ずかしいようなところもありますが、これでうまくいっているので良しとしています。





































NO PC WEEK に代わる PC 使用制限のしくみ(新β2版)
No. A1.
開始時
運動
A2.
勉 強
1問
A3.
終了時
運動
H1. 予定
作業内容
H2. 予定
作業詳細(進捗%)
判定×の理由
B. 実際
開始時刻
C. 予定
使用時間
(当日限度)
D. 予定
終了時刻
E. 実際
終了時刻
F. 実際
使用時間
G1. 判定
◎ 9分以下
○ 10分~19分
△ 20分~29分
× 30分以上
500 × ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 16:55 1:05(お試し中unlock) 18:00


区 切りの際に15分以上 別のこと: 昼食
499 × × Bluetoothヘッドホン
音声無しで30分くらい経つとプツプツになるのを対処
Bluetoothリセットのスクリプトで対処しようとした。
時間がかかってきつかったが、うまくいった。
13:25 1:30(お試し中unlock) 14:55 15:17 1:52 (お試し中 2h越えたら×)◎
498 × ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 17:20 1:30(お試し中unlock) 18:50 23:00 5:10 (お試し中 2h越えたら×)×
区 切りの際に15分以上 別のこと: 間食、アニメ
497 × ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 12:55 1:30(お試し中unlock) 14:25 16:10 1:45 (お試し中 2h越えたら×)◎
496 × × ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 21:15 1:45(お試し中unlock) 23:00 23:00 1:45 (お試し中 2h越えたら×)◎
区 切りの際に15分以上 別のこと: 夕飯など
495 ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 19:00 1:30(お試し中unlock) 20:30 20:29 1:29 (お試し中 2h越えたら×)◎
494 × ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 22:25 0:35(お試し中unlock) 23:00 23:00 0:35 (お試し中 2h越えたら×)◎
493 × ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正
20:30から始めて23:00までの間に一度休むのは半端だと思った
20:35 1:30(お試し中unlock) 22:05 23:00
2:25
(お試し中 2h越えたら×)×
492 × ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 20:25 1:30(お試し中unlock) 21:55 21:55
1:30
(お試し中 2h越えたら×)◎
区 切りの際に15分以上 別のこと: 皿洗い、夕飯の支度
491 ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正
バグ取りに手間取った
16:30 1:30(お試し中unlock) 18:00 19:22 2:52 (お試し中 2h越えたら×)×
区 切りの際に15分以上 別のこと: いつも清掃しない場所の清掃
490 ページ上のプログラムリスト表示機能の復帰(再度 作成) 挿絵について修正 13:45 1:30(お試し中unlock) 15:15 15:19 1:34 (お試し中 2h越えたら×)◎
489 × × ページ上のプログラムリスト表示機能の復帰(再度 作成) いくつか修正 21:30 1:30(お試し中unlock) 23:00 23:00 1:30 (お試し中 2h越えたら×)◎
488 × ページ上のプログラムリスト表示機能の復帰(再度 作成) いくつか修正
21:30
1:30(お試し中unlock)
23:00 23:00 1:30
(お試し中 2h越えたら×)◎
487 × × × ページ上のプログラムリスト表示機能の復帰(再度 作成) バグ修正 21:45 1:15(お試し中unlock) 23:00


486 × Web ページ記事作成 プログラムリスト表示機能について 20:20 1:30(お試し中unlock) 21:50 23:00
2:40
(お試し中 2h越えたら×)×
区切りの際に15分以上 別のこと: 夕飯作り
485 ページ上のプログラムリスト表示機能の復帰(再度 作成) diffコマンド実装
(2つのファイルの比較)
16:45 1:30(お試し中unlock) 18:15 18:45 2:00 (お試し中 2h越えたら×)◎
区切りの際に15分以上 別のこと: 間食
484 ページ上のプログラムリスト表示機能の復帰(再度 作成) diffコマンド実装
(2つのファイルの比較)
13:40 1:30(お試し中unlock) 15:20 15:39 1:49 (お試し中 2h越えたら×)◎
483 × ページ上のプログラムリスト表示機能の復帰(再度 作成) diffコマンド実装
(2つのファイルの比較)
21:10 1:50(お試し中unlock) 23:00


482 × × ページ上のプログラムリスト表示機能の復帰(再度 作成) diffコマンド実装
(2つのファイルの比較)
22:00 1:00(お試し中unlock) 23:00 23:00 1:00 (お試し中 2h越えたら×)◎
481 PC-9801 アセンブラ学習
Cコンパイラ用意
open watcom の試用
20:30
1:30(お試し中unlock) 22:00
22:16
1:46
(お試し中 2h越えたら×)◎
480 PC-9801 アセンブラ学習
本「98マシン語」
2章 マシン語の基礎知識
3. モニタの使い方
実機DISK作成に手間取った
19:45 1:30(お試し中unlock) 21:15 21:50 2:05 (お試し中 2h越えたら×)×
区切りの際に15分以上 別のこと: 台所の皿洗い、買い物
479 PC-9801 アセンブラ学習
本「98マシン語」
2章 マシン語の基礎知識
3. モニタの使い方
15:30 1:30(お試し中unlock) 17:00 17:10
1:40
(お試し中 2h越えたら×)◎
478 PC-9801 アセンブラ学習
本「98マシン語」
2章 マシン語の基礎知識
3. モニタの使い方
22:25 0:35(お試し中unlock) 23:00 23:00
0:35
(お試し中 2h越えたら×)◎
区 切りの際に15分以上 別のこと: 自販機へ買い物、台所の皿洗い、間食
477 ページ上のプログラムリスト表示機能の復帰(再度 作成) しあげ
長かったですが完成
20:00 1:30(お試し中unlock) 21:30 21:36 1:36 (お試し中 2h越えたら×)◎
476
ページ上のプログラムリスト表示機能の復帰(再度 作成) しあげ
うまくいかなかった
でもひと段落。良かった
15:20 1:30(お試し中unlock) 16:50 18:37 3:17 (お試し中 2h越えたら×)×
区 切りの際に15分以上 別のこと: 台所の皿洗い、トイレ掃除
475 ページ上のプログラムリスト表示機能の復帰(再度 作成) しあげ 13:00 1:30(お試し中unlock) 14:30 14:37
1:37
(お試し中 2h越えたら×)◎
474 ページ上のプログラムリスト表示機能の復帰(再度 作成) しあげ 21:00 2:00(お試し中unlock) 23:00 23:00
2:00
(お試し中 2h越えたら×)◎
区切りの際に15分以上 別のこと: 台所の皿洗い
473 × ページ上のプログラムリスト表示機能の復帰(再度 作成) しあげ 18:45 1:30(お試し中unlock) 20:15 20:15 1:00 (お試し中 2h越えたら×)◎
472 × ページ上のプログラムリスト表示機能の復帰(再度 作成) しあげ 21:45 1:15(1:30) 23:00


471 × ページ上のプログラムリスト表示機能の復帰(再度 作成) しあげ 22:00 1:00(1:30) 23:00 23:00 1:00
470 ×
PC-9801 アセンブラ学習
本「PC-9801スーパーテクニック」
読み進めと、
ホームページ更新
自己啓発だから、と考えた
14:00
unlock unlock 23:00
9:00
×

この表の意図:

多くの人はパソコンのやりすぎやネットゲームのやりすぎには困っていると 思います。

参考に言うと、この表を使う前の私は 1 回の PC 使用時間がノンストップで 17 時間というときもあったし、平均で言うと毎日 9 時間はやっていたと思います。

この表を使ってパソコンの使用時間を 事前に決めてネッ ト上に公開 することで、パソコンのやりすぎを防止できたら、と思います。

また、数年前から考えてきましたが、そういう徹夜とか長時間作業をするよ りも、昼間の短時間作業のほうが生産性は高いのではないかと思います。そういう意味でも期待しています。

※以前は NO PC WEEK と称してパソコンを使用しない期間を設けることでやりすぎに対処してきましたが、もっと具合の良い方法はないかと考え、この表を使うようになりました。


臨時お試し(2022年1月8日~)

最近、状況が以下のように少し変化していて…

  • 23時で電源が切れる自動制御がとても強制的で、うまくいっている。
  • 23時以降まったくできなくなり、使用時間が減ってしまった。
  • 最近、通常のPC作業の他に、「PC-9801でのアセンブラ学習」が加わったので、さらに時間が足らなくなった。

…これまでのやり方だとうまくいかないところがあるので、お試しでやり方を少し変更します。

お試しで以下のようにします。

  • 基本的に何時間でもやってよい。
  • ただし、1.5h(または2.0h)ごとに区切り、区切りの際に15分以上 別のことを行う。
    行った内容は、参考のために記録と記録の間に記載する。
  • 使用可能時刻は、昼12:00~夜23:00のあいだ。(自動的に電源制御される)
  • 1.5hの開始時と終了時にこれまでどおり、開始時:運動、勉強、終了時:運動 を行うこと。
  • 以上は平日は火木金のみとし、月水は以下のようにする。
    月水は、「PC-9801でのアセンブラ学習」について基本的に本だけで学習する。
    しかし、必要な場合は1項目に限ってPC-9801の電源を入れて良い。

これがうまくいかない場合は、以上を取り消しします。

(「1.5h(または2.0h)ごとに区切り、」というのが難しいんじゃないかと思う…)

中途結果

  • これまでは 1.5h や 3, 4h の時間制限があったが、このお試しは時間が限られていないので、少し気持ちが楽になって良い。「余計なことで時間を使ってしまった~」というのが無い。


記入の規則:

  • 日付は表示していません(私の生活パターンをすべて知らせるのはよくないから)。しかし、白と灰色の色分けは、同じ色の連続 で同じ日を表しています。
  • 左端の「A1. 運動」、「A2. 1問」、「A3. 運動」について
    この表の目的とは異なりますが、ついでとして、遊び100%の毎日を送るときでも勉強の習慣を忘れないために、たった1問で良い ので解くことにします。
    正直言うと毎回遊ぶ前に必ず1問勉強するのは心が折れそうです。でも慣れさえすれば…と思います。(追記:やってみると結構効果 的で役立っています)
    行ったら◎、行わなかったら× を記入します。
    2020年11月20日ぐらいから「A1. 運動」を追加しました。パソコンを行う前に運動することを強制するものです。腕立て伏せ10回とか腹筋10回とかです。
    (ホントだったら30回くらいはやりたいところですが、私は体の調子が悪いので、10回程度にしています)
    2021年6月26日「A3. 運動」を追加。PC使用の終了時にも運動する。
    A1はPC漬けによる筋力衰え対策の意味で、筋トレを行い、
    A3はPC作業でこった体をほぐす意味で、ラジオ体操やストレッチ体操を行う。
  • 右端の「G. 判定」について
    「D. 予定終了時刻」と「E. 実際終了時刻」を比べて、オーバーした時間によって判定を行います。
    ◎ 9分以下
    ○ 10分~19分
    △ 20分~29分
    × 30分以上 (オーバー理由を記載する。理由の統計を取れば何が問題なのか把握でき、改善しやすいです)
  • 平日の 1.5h、2.0h の PC 使用の連続が負担になっているので、週のスケジュールは下記のようにする。
    月水で PC 使用しないことでうまいぐあいに「体力回復」されて、「生活」がうまく回り、プログラミング以外の「創作活動」(イラスト等)に時間が取れることを期待します。
    月:0h
    火:1.5h
    水:0h
    木:1.5h
    金:1.5h
    土:5hまで(休日で、翌日も休日)
    日:3hまで(休日で、翌日平日) ←早起きなおかつ(日々の買い物とかじゃなく)散歩するなら 3h やって良い
    (※2021年2月2日:週の各時間を調整しました)
    (※2021年12月12日:電源タイマーで23時で終了することに期待できるので土日の各時間を1時間ずつ増やしました)
  • ×、△、"記録しなかった長時間作業" が多いと思ったら、バランスをとるために、NO PC WEEK※ を1週間実施する。
    NO PC WEEK とは私自身の健康のために私のパソコンの使用を制限する期間です)


ちなみに、分単位で記録を取ったりして、だいぶマメに見えるかもしれませんが、Windows の日本語入力(MS-IME)で「いま」と入力し、 変換 キーを押さずに ボタンを押すと現在の時刻になります。道具の便利さが人をマメに見せるのかもしれません。

例外事項:

  • 「E. 実際終了時刻」のあと、プログラミングの場合のみスッパリ終了しないで、今後のプログラミングの方針をテキストファイルに書くのは OK にしています。


「スーパーPC WEEK」:

連休中(3連休以上)に、NO PC WEEK をオフにして好きなだけパソコンを使ってよいとする期間を、「NO PC WEEK」に対して「スーパーPC WEEK」と言う。

ただし以下の決まりを守ること。

  • その日に自由にパソコンを使ってもよいが、1回あたり、いつものように表に記入すること。(開始時運動、勉強1問、終了時運 動も行うこと)
     
  • 1回ごとに、掃除、炊事、洗濯や、別の趣味など、まとまった作業を はさむこと。
     (理由: 1回1回がが連続してつながると回を分けている意味がなくなるから)
  • 24時に就寝するよう努めること。(強制ではないが、つとめること)
     
  • 連休の最終日は通常通りとする。
     
  • 1回の使用時間は2時間を最大とすること。

なお、表の中央やや右寄りの「C. 予定 使用時間(当日限度)」列の "当日限度" には UNLOCK と記入する。


中途結果:

結構いい結果になっています。 炊事や掃除、散歩、早起きなどが好ましいリズムでできるようになりました。

(2020年9月6日追記:散歩、早起きは最近あまりできていません。掃 除や炊事は理想的にできています)

ま た、パソコン以外の趣味も進むようになりました。電子回路、ガンプラ、RPG のプログラム以外のモンスターイラストやストーリーなど RPG の肉付け部分の創作、勉強、昔好きだったペーパークラフト等々。

そ してパソコンの趣味自体も深夜遅くまで行うよりも質が高くなったように感じます。制限された短い時間の中で結果を得ようとす るので、取捨選択が行われているし、時間が終了して、空いた時間ができ、それがほどよい休憩になり、今後の作業の方針を落ち 着いて検討することもできます。それが質につながっているのかなと思います。

この取り組みが、15 才 ~ 18 才くらいまでの高専(中退)に所属していた時に実施できていたら良かっただろうなと思います。でもそれくらいの年齢では経験が浅く、このような効果的なルール作りを行うこ とはできなかったと思います。自分は人に比べて「創作意欲」や「ゲームで遊ぶ欲望」におぼれやすいところがあり、そのコントロールは とても難しいです。

2021年10月23日追記:

ここで決めた規則通りにできていないこともありますが、それでも確実なメ リットがあるのでここに箇条書きで記します。

  • 事前事後に運動することで、身体の「こり」がある程度解消されるのを期待できる。
  • 規則正しい生活になっている。食事、掃除、ふろ等、以前は後回しにしていたものが、時間通りにできている。
  • 「平日月水はパソコン作業を行わない」という規則が、よいリズムになっている。平日毎日パソコンに向かっていたら、疲れもた まるだろうと思う。
  • 表中にどんな作業をしているのか記入しているので、訪問者に日ごろのパソコン作業の内容を、わりとリアルタイムに知らせるこ とが出来る。

他にもメリットはありますがたくさん書いてもしょうがないのでここまで。

また、反面、デメリットもあるので少し書いておきます。

  • 普通の人はやらないことを行い、なおかつWeb ページ上で公開しているので、「おかしな人だ」、「病気だろ」と思われてしまう。
  • 「創作は、生活のリズムを規則正しくしたほうが生産性が上がる」と考えていたが、ガツっと進めたいときに時間制限がかかり、 やきもきするし、実際、やりたいことが遅々として進まない。

デメリットはそれくらいしか思いつきません。我ながらメリットの多い表な んだと再確認しました。


自分の家族にすすめたい方へ:


(これは イラス トAC の無料素材です)

パソコンのやりすぎやネットゲームのやりすぎは社会問題にもなっているので、「うちの子についてなんとかしないと…」と思っている ご家族の方は多くいらっしゃると思います。

私の両親も過去に私について問題にしていました。学校へ行かず、毎日朝までパソコンに向かい、 悶々としていたんです。


この表はその家族が困っていたときから 30 年後に、私が自分で必要を感じて作ったものです。

私は今 一人暮らしをしていて、自分で生計を立てる中、パソコンにおぼれた生活をすると、生活がうまく回らなくなるんです。

具体的には、

  • 人前で疲れた顔を見せてしまい、人間関係がうまくいかなくなる。もっと具体的には、職場、とこや、お店のレジ、歯医者。
  • 掃除、洗濯、炊事が後回しになり、実質、それらを行う時間がなくなってしまう。深夜遅くや翌日に回したり、行わなかったりす る。

これらを改善するために表を作りました。


でも、このような必要にせまられて「自分の動機で始めた場合」と、「人からすすめられて始めた場合」とでは、結果が異なると思いま す。

自分の切実な動機で始めたなら自分から進んでこの表を活用すると思いますが、外から押し付けられたものはなかなか定着しないもので す。

あまり適当なことは言えませんが、「中途結果」タブの中の青い部分で 書いたことは、本人にとって得になることなので、「ときどき休憩して、他のあの趣味やってみたらどうだ?」とか「ときどき休憩したほ うがプログラミングの質が上がるって話だぞ?」という形ですすめてみたらどうでしょうか。(それでも最終的には自立してもらうことは 必要だと思いますが)


私が両親を困らせていたときに、突然、外へ一人で出て行って、一人暮らしを始めたり、接客業を始めたり、いくつか資格取得したりと いろいろ行えた理由というのは、正直言ってわかりません。(※しかし途中で失業して2度、実家に戻ったことがあります。1 回目は 21 才くらいのときに 5 年間、2 回目は 35 才くらいのときに1年未満、実家にいて、何もしてなかったり働いたりしていました)

私が両親を困らせていたのは 16 才 ~ 20 才くらいの学生のころですが、そのころ家族と私自身と友人たちがみんなそれぞれ、私の生活について心配したり困ったり悩んだり、あの手この手を試したりしていました。そう いう煮詰まったような状況が運命をそのように(解決の方向へ)動かすのかもしれません。運命がどうの というのは変ですが、そのくらいのことしか言えません。何かしら取り組む必要があるということですかね。


この社会問題はクリアーすべきものみたいです。



最近観ているアニメ: 最近観ているアニメ
日 付
(上ほど新しい)
タイトル 無料配信
配信日
公評価 私 評価
2021/12/26~視聴中 ジョジョの奇妙な冒険 スターダストクルセイダース(リンクは Yahoo GYAO で検索)
アクション・アドベンチャー/1989年週刊少年ジャンプ/各話24 分程度
4thシーズン「黄金の風」、3rdシーズン「ダイヤモンドは砕けな い」とGYAOで十分に楽しんで観てきましたが、2ndシーズン「スターダストクルセイダース」これもまた面白い!
OVA版(1993年)ではなくテレビアニメ版(2014年)。第48話まである。
観てみると、絵柄、演出、どれをとっても、なんともパワフルだと思う。
おすすめです!
月火・・土日 ★★★★
5
★★★★
4
2021/7/15~視聴中 ドラゴンボール(リンクは Yahoo GYAO で検索)
冒険・格闘技/1984年週刊少年ジャンプ/各話25分程度
月・水・金・・ ★★★★
4.8
★★★★
4.5
2021/5 /18~視聴中 はじめの一歩(リンクは Yahoo GYAO で検索)
ボクシング/1989年週刊少年マガジン/各話25分程度
大人になってわかる、ドラゴンボールを上回る面白さ。スケベ表現がた まにあるので男性向け?
10月16日(土) 追記
シリーズが「New Challenger」という新しいものに変わりました。
1話2話を見る限り、あまり面白くなくなってしまったかも。
でもその後、数話見ていると、以前ほどではないけど結構面白いです。
1月1日(土)追記
はじめの一歩 Rising #12 完全なるデンプシー破り
演出最高!感動で涙が出てきた。
悲しいとか嬉しいとかそういう涙ではなく、感動で身体がしめられてそれで出る涙。
「演出」が何なのか素人なので知らないけど、その時の音楽とか映像とか、その辺で感動させられました。
私に★5を出させるとは…やられたぞ!!
月・水・・土・ ★★★★
4.5
(第1シーズン)

★★★☆☆
↑たしかこれくらい
(New Challenger)

★★★☆☆
3.5
(Rising)
★★★★★
5.0
(第1シーズン)

★★★☆☆
3.0
(New Challenger)

★★★★☆
4.0
(Rising)
最近観た映画: 最近観た映画
日 付
(上ほど新しい)
タイトル 無料配信
(日付まで)
公評価 私 評価
2021/12/28(水) マトリックス【吹替版】(リンクは Yahoo! GYAO! で検索)
SFアクション/1999年アメリカ/2時間16分/キアヌ・リーブ ス
面白いんだけど、物語がもう一歩かなと思う。
2022/2/22
までGYAOにて無料配信
★★★★☆
4.2
★★★☆☆
3.9
2021/11 /27(土) コード211【吹替版】(リンクは Yahoo! GYAO! で検索)
刑事アクション/2018年アメリカ/1時間27分/ニコラス・ケイ ジ
面白かったのに、どうして公評価が★2.9なんだろ…
こういう言い方は変かもしれませんが、昭和の時代の全盛期のハリウッ ド映画が好きな方は楽しめるんじゃないかと思いました。
私が一番いいなと思ったのは、同乗者の少年かな。彼がいなかったらあ りきたりの映画になったかも。 オススメ!
公評価の低評価の具体的な内容は、だいたいは「面白そうな要素(傭兵 やインターポール)が多いのに、ひねりのない展開(正統的)で最後があっけない」でした。
いつも思いますが、公の評価はレベルが高く、少し厳しいのかなと思い ます。
無料配信
現在終了
★★☆☆☆
2.9
★★★★☆
4
2021/10 /25(月) バーニング・オーシャン【吹き替え版】(リンクは Yahoo! GYAO! で検索)
ディザスター/2016年アメリカ/1:47:14/マーク・ウォールバーグ(トランスフォーマー)、カート・ラッセル(バックドラフ ト)
2010年メキシコ湾原油流出事故」(リンクは Wikipedia)をもとに製作されたディザスタームービー。
技術的不手際により掘削中の海底油田から逆流してきた天然ガスが引火 爆発し、126人の作業員のうち11人が行方不明となり、17人が負傷した。
下記のアンダーウォーターと同じく、描写は完ぺき。なおかつ、面白 かった。
2021/11/5
までGYAOにて無料配信
★★★★☆
4
★★★☆☆
3.8

最近買ったもの: 最近買ったもの
日 付
(上ほど新しい)
タイトル 公評価 私 評価
2021/8/7 曲:アンインストール(リンクは Apple Music の当該ページへ)
2007年の「ぼくらの」というロボットアニメの主題歌
歌詞を読みましたが、「突然現れた新しい現実に対し、受け入れ、や るっきゃない」と言っているのかなぁ…
★★★★★
5
★★★★
4
2021/7/9 ゲーム:ザ・トリロジーズ -T&E SOFT / XTAL SOFT COLLECTION-(リ ンクは EGG の当該ページへ)
PCレトロゲームのセット。RPG開発の研究のために予約で購入。発売日は2022年2月だそうです。
発売前 発売前
2021/5/29 曲:最強○×計画(リンクは Apple Music の当該ページへ)
2006年の「すもももももも 地上最強のヨメ」というアニメの主題 歌
★★★★
4.5
★★★★
4


自己紹介: 自己紹介

47才、男、B型(BB)

電子機器の基板を製造する工場で、派遣で働いています。

プログラミングが好きで小学校5年生のころからずっと続けています。

アニメ見ます、ガンプラ作ります、映画見ます、ゲーム音楽いっぱい聴きます。

ページ上にていろいろ才能(少々 粗削りな才能)を発揮していると思いますが、なるべく自 分だけで終わらないようにといつも思っています。

いろいろ厳しい考え方も持っていますが、厳しすぎないように全体とのバランスも考えていま す。

将来の夢は5つくらい持っていますが、生きてる間に実現できそうにありません。

私が使っているペンネーム(ハンドルネーム)は新しい順に

ペ ンネーム(ハンドルネーム) いつごろ 場 所
daikei 現在(少) Yahoo Japan
d_kawakawa 現在(多) どこでも
cookiepuddingman、cookiepudingman ちょっと前 Twitter
かわ、kawa 30年前 パソコン通信

※基本的には d_kawakawa とお呼びください。

※なお、現在このホームページには私 への連絡手段がありません。気が向いたら用意します。


PC-9801 臨時特設ページを開く


日記: 日記  (日記がこのサイトのメインコンテンツです。上の記事ほど新しい記事です)

2022/1/23(日)

最近の写真

fig.
▲パンジー

冬の花「パンジー」を近所の花屋で買いました。

花だけではなく、葉もきれいだな。

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲私の鉢植え

両端の横長の鉢が今回買ったパンジー。

中央の丸い鉢は以前からある花で、もう5,6年は生き続けているかな?

茎が木の枝のように茶色く固く強く、花なんだけど、木みたいです。

1,2年前に、そばのブロック塀(べい)から、ケンカ中の猫が鉢植えに向かって勢いよく飛び降りたときに、枝の半分が根元から折れてしまい、写真のように盆栽みたいに横方向に 片寄っちゃいました。

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲テクニカルデータブック

アスキー出版テクライト「PC-9801シリーズ  テクニカルデータブック HARDWARE編」

(1992年4月初版発行、定価4500円)

「アセンブラやるならその機械の資料はたくさん持っていたほうが良い」

と、どこかのサイトで教えてくれていたので、購入することにしました。

Amazon にて中古本 878 円+送料 350 円 で購入しました。(今月 1/4 に購入)

PC-9801 という過去の PC のハード ウェア操作のための資料”、

貴重な情報源

…等と言われている本です。

1992 年初版発行ですが、そのころ私は 18 才でした。

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲届いた直後、BASICで正方形を表示

PC-9801 の画面は 640×400 というかなりマイナーなサイズです。普通のディスプレイにつなぐと縦長に引き伸ばされてしまいます。

PC-9801 の画面をゆがみなく正しく表示できるディスプレイがほしいと思って、WEB検索したところ、次のようなサイトを見つけました。PC-9801 で使えるディスプレイの探し方を伝授してくれています。

PC98 で使える液晶ディスプレイ(モニター)の条件について

このサイトの管理者ご本人が使っている「EIZO L997」が高機能で良いなと思いました。

サイトを見ると、綺麗な画面ですよね。

Yahoo! オークションで探したら、運よくありました。コレ

即決価格 15,000 円+送料 1,958 円。

低所得でこれからコロナウイルス感染拡大で、もし仕事が休業になってしまうと、派遣なので時給ですから休んだ分給料が減ってしまい、生 活費がキリキリになってしまう恐れがあります。

だから、この出費は大きい…。でも購入することにしたそのわけは?

恥ずかしながら私の私的なメモです↓

という目的をしっかりと持って購入することにしたんです。

オークションでしたが、即決価格で入札したので誰とも競わず落札し、無事に品物が届きました。

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲右がEIZO L997 まさかの劣化品

届いて、いざ表示してみると、なんだか画面が暗い?

いろいろ調べていたら、どうやら液晶のバックライトが経年劣化で暗くなっているということらしいです。

がっかり!!

”がっかりだよッ!”

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲EIZO L997 + マルチペイント

でも、目的は PC-9801 でアセンブラを学ぶ、ということで、PC-9801 での画面はどうかなと思って「マルチペイントシステム」でお絵描きして様子を見てみました。

まぁ、楽しんで絵を描けたので、大丈夫かなと思います。

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲マルチペイント コマンドライン出力文字

マルチぺイントの起動時のコマンドライン出力(テキスト)

左の画像リンクをクリックすると 画像を拡大 します。



▼画像を PC-9801 から Windows へ移動してきました


fig.
▲GLIO のサークルコマンドを実行

「98ハードに強くなる本II」のサンプルプログラムの1つを実行しました。

「オー出た」と喜んじゃいました。

PC-9801 特有の「グラフィックLIO(Logical Input Output)」という ROM 上のソフトウェアを使って、楕円(扇形)を描いています。

PC-9801 の BASIC 言語である 「N88-BASIC」は内部でこの「グラフィックLIO」を使ってグラフィックを描いているらしいです。

30年前はよく「N88-BASIC」を使って何かを作っていましたが、今こうやってアセンブラから直接「グラフィックLIO」にアクセスして同じ動作をさせてみると、なんともうれしい感じがします。

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲GLIO のサークルコマンドを実行2

同じサンプルプログラムをちょっといじって正円にしてみました。

正円が縦方向に引き伸ばされずに、ちゃんと正円で表示されています。

「オーやっぱり燃えてくるな」

EIZO L997 を買った甲斐(かい)がありました。

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲GLIO のサークルコマンドを実行3

さらに、円の塗りつぶしにパターン(タイル)が使えるというのでやってみました。

「面白すぎるぞ PC-98。なるほどこれはスゴイ」

左の画像リンクをクリックすると 画像を拡大 します。



fig.
▲VRAM に値を入れるとそのまま描かれる

ちょっと気が向いて、「N88-BASIC」の MON コマンドでモニタモード(アセンブラ環境)に入り、メモリ上の VRAM 部分(アドレスA800H)に何か値を入れてみました。

すると画面の左上に少し、グラフィックの青いドットが描かれました。

オオっ、と思って、モニタモードの F コマンド(メモリの指定アドレスから指定アドレスまでを指定バイトで埋める)を使って、左図のように手動でグラデーションをかけて遊んでみました。(円は上図の円をそのまま残していたものです)

これが、わりと高速に描画されるので、そりゃぁもう大感動でした。

この感動を、何度も言いますが、高校生の時に知りたかった、、ほんとに。

左の画像リンクをクリックすると 画像を拡大 します。



▼PC-9801 という世界には、無限の宇宙が広がっている。

どうして Windows にはその無限の宇宙を感じなかったのだろうか。

Android でもアプリをちょっと作ったけど、違うと思った。

コンピューターの環境が先進的になればなるほど、

何か落胆していくのはどうしてなんでしょうね。

本当の車好きは、プリウスよりもアルファロメオのほうがずっと楽しいのと同じかな。


2022/1/15(土)

プログラムリスト表示機能 diff コマンドテスト

このウェブページ上での「プログラムリストの表示機能」のテストです。

プログラムリストを、一部変更したり、行を追加したり、削除したりして、新しいプログラムへと書き換える作業は、プログラマーならだれでも日常 的に行っていると思い ます。

その「書き換え前のプログラムリスト」と「書き換え後のプログラムリスト」を比較して、どの部分が変更されたのかを、マーキングして表示するよ うにしました。

下のプログラムリストの表示では、変更された部分について、追加行、変更行、削除行のようにマーキングしています。削除行についてはその行がな いので、この位置にあったよ、という意味です。

下に掲載している「プログラムリスト表示機能」の処理時間
ユーザ時間:0.008秒 / システム時間:0.000秒 / 子プロセスユーザ時間:0.000秒 / 子プロセスシステム時間:0.000秒
<html>

<head>

<meta content="text/html; charset=UTF-8" http-equiv="content-type">

<title>untitled canvas</title>

<script>

console.log( "=============== script ==============" );

/*

『原理を使用した3DCG - 基本プログラム』


実行すると、正六面体の頂点8つが3DCG計算されて描かれる。








*/

function $( id ) { return document.getElementById( id ); }

var HereDocument = /\/\*\s*([^]*?)\s*\*\//;

var canvasEL, canvas;


function onloadx() {

canvasEL = $( "canvasELID" );

canvas = canvasEL.getContext( '2d' );

screenW = canvasEL.width;

screenH = canvasEL.height;


//(canvasSpecial resize / crisp low)


//正六面体の頂点(中心を原点としたときの位置)

tens = [

{ x : -1, y : -1, z : -1 }, //0: 左下 手前

{ x : +1, y : -1, z : -1 }, //1: 右下 手前

{ x : +1, y : +1, z : -1 }, //2: 右上 手前

{ x : -1, y : +1, z : -1 }, //3: 左上 手前


{ x : -1, y : -1, z : +1 }, //4: 左下 奥

{ x : +1, y : -1, z : +1 }, //5: 右下 奥

{ x : +1, y : +1, z : +1 }, //6: 右上 奥

{ x : -1, y : +1, z : +1 }, //7: 左上 奥

];


//正六面体の拡大

scale = 10;


//正六面体の位置

posX = 0;

posY = 0;

posZ = 80;


//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)

s = 50;


draw();

}

function draw() {


for( var i = 0; i < tens.length; i++ ) {

var x = tens[ i ].x;

var y = tens[ i ].y;

var z = tens[ i ].z;


//scale倍

x *= scale;

y *= scale;

z *= scale;


//位置へ移動

x += posX;

y += posY;

z += posZ;


//3Dの座標を2Dの座標に変換する

var h = x * ( s / z );

var v = -y * ( s / z );


//画面を引き延ばし

h *= 14.25;

v *= 14.25;


//描画

canvas.beginPath();

canvas.arc( screenW / 2 + h, screenH / 2 + v, 4, 0, 6.28, false );

canvas.closePath();


canvas.fillStyle = "orange";

canvas.fill();

}

}

</script>

<style>

</style>

</head>

<body onload="onloadx();" style="

background-color : lightgray;

height : 100%;

margin : 0;

">

<canvas id="canvasELID" width="512" height="448" style="

display : block;

margin : auto;

background-color : white;

border : solid 1px black;

">There is no canvas.</canvas>

</body>

</html>


下に掲載している「プログラムリスト表示機能」の処理時間
ユーザ時間:0.016秒 / システム時間:0.008秒 / 子プロセスユーザ時間:0.000秒 / 子プロセスシステム時間:0.000秒
<html>

<head>

<meta content="text/html; charset=UTF-8" http-equiv="content-type">

<title>untitled canvas</title>

<script>

console.log( "=============== script ==============" );

/*

『原理を使用した3DCG - 基本プログラム』


実行すると、ワイヤーフレームで正六面体が描かれる。



3DCG仕様:

Z軸は奥へ行くほど増加し、手前に来るほど減少する。




*/

function $( id ) { return document.getElementById( id ); }

var HereDocument = /\/\*\s*([^]*?)\s*\*\//;

var canvasEL, canvas;


function onloadx() {

canvasEL = $( "canvasELID" );

canvas = canvasEL.getContext( '2d' );

screenW = canvasEL.width;

screenH = canvasEL.height;


//(canvasSpecial resize / crisp low)


//正六面体の頂点(中心を原点としたときの位置)

tens = [

{ x : -1, y : -1, z : -1 }, //0: 左下 手前

{ x : +1, y : -1, z : -1 }, //1: 右下 手前

{ x : +1, y : +1, z : -1 }, //2: 右上 手前

{ x : -1, y : +1, z : -1 }, //3: 左上 手前


{ x : -1, y : -1, z : +1 }, //4: 左下 奥

{ x : +1, y : -1, z : +1 }, //5: 右下 奥

{ x : +1, y : +1, z : +1 }, //6: 右上 奥

{ x : -1, y : +1, z : +1 }, //7: 左上 奥

];


mens = [

[ 3, 2, 1, 0 ], //向かって正面

[ 1, 2, 6, 5 ], //向かって右面

[ 0, 4, 7, 3 ], //向かって左面

[ 7, 6, 2, 3 ], //向かって上面

[ 0, 1, 5, 4 ], //向かって下面

[ 5, 6, 7, 4 ], //向かって背面

]; //※各面の点の並びは時計回り


//正六面体の拡大

scale = 10;


//正六面体の位置

posX = 0;

posY = 0;

posZ = 80;


//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)

s = 50;


draw();

}

function draw() {


//各面について

for( var i = 0; i < mens.length; i++ ) {

var men = mens[ i ];


//描画

canvas.beginPath();

//面を構成する各頂点について

for( var j = 0; j < men.length; j++ ) {

var tenIDX = men[ j ];


var x = tens[ tenIDX ].x;

var y = tens[ tenIDX ].y;

var z = tens[ tenIDX ].z;


//scale倍

x *= scale;

y *= scale;

z *= scale;


//位置へ移動

x += posX;

y += posY;

z += posZ;


//3Dの座標を2Dの座標に変換する

var h = x * ( s / z );

var v = -y * ( s / z );


//画面を引き延ばし

h *= 14.25;

v *= 14.25;


//最初の点はmoveTo、続く点はlineTo

if( j == 0 ) {

canvas.moveTo( screenW / 2 + h, screenH / 2 + v );

} else {

canvas.lineTo( screenW / 2 + h, screenH / 2 + v );

}

}

canvas.closePath();


//面の線を描く

canvas.strokeStyle = "black";

canvas.stroke();

}

}

</script>

<style>

</style>

</head>

<body onload="onloadx();" style="

background-color : lightgray;

height : 100%;

margin : 0;

">

<canvas id="canvasELID" width="512" height="448" style="

display : block;

margin : auto;

background-color : white;

border : solid 1px black;

">There is no canvas.</canvas>

</body>

</html>


下に掲載している「プログラムリスト表示機能」の処理時間
ユーザ時間:0.008秒 / システム時間:0.000秒 / 子プロセスユーザ時間:0.000秒 / 子プロセスシステム時間:0.000秒
<html>

<head>

<meta content="text/html; charset=UTF-8" http-equiv="content-type">

<title>untitled canvas</title>

<script>

console.log( "=============== script ==============" );

/*

『原理を使用した3DCG - 基本プログラム』


実行すると、ワイヤーフレームで正六面体が描かれる。

(draw()の処理構造を変更。のちの陰面処理などはこの構造が適している)



3DCG仕様:

Z軸は奥へ行くほど増加し、手前に来るほど減少する。



*/

function $( id ) { return document.getElementById( id ); }

var HereDocument = /\/\*\s*([^]*?)\s*\*\//;

var canvasEL, canvas;


function onloadx() {

canvasEL = $( "canvasELID" );

canvas = canvasEL.getContext( '2d' );

screenW = canvasEL.width;

screenH = canvasEL.height;


//(canvasSpecial resize / crisp low)


//正六面体の頂点(中心を原点としたときの位置)

tens = [

{ x : -1, y : -1, z : -1 }, //0: 左下 手前

{ x : +1, y : -1, z : -1 }, //1: 右下 手前

{ x : +1, y : +1, z : -1 }, //2: 右上 手前

{ x : -1, y : +1, z : -1 }, //3: 左上 手前


{ x : -1, y : -1, z : +1 }, //4: 左下 奥

{ x : +1, y : -1, z : +1 }, //5: 右下 奥

{ x : +1, y : +1, z : +1 }, //6: 右上 奥

{ x : -1, y : +1, z : +1 }, //7: 左上 奥

];


mens = [

[ 3, 2, 1, 0 ], //向かって正面

[ 1, 2, 6, 5 ], //向かって右面

[ 0, 4, 7, 3 ], //向かって左面

[ 7, 6, 2, 3 ], //向かって上面

[ 0, 1, 5, 4 ], //向かって下面

[ 5, 6, 7, 4 ], //向かって背面

]; //※各面の点の並びは時計回り


//正六面体の拡大

scale = 10;


//正六面体の位置

posX = 0;

posY = 0;

posZ = 80;


//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)

s = 50;


draw();

}

function draw() {


//頂点の位置を計算

var tensC = new Array();

for( var i = 0; i < tens.length; i++ ) {

var x = tens[ i ].x;

var y = tens[ i ].y;

var z = tens[ i ].z;


//scale倍

x *= scale;

y *= scale;

z *= scale;


//位置へ移動

x += posX;

y += posY;

z += posZ;


//3Dの座標を2Dの座標に変換する

var h = x * ( s / z );

var v = -y * ( s / z );


//画面を引き延ばし

h *= 14.25;

v *= 14.25;


//値を保管

tensC[ i ] = new Object();

tensC[ i ].x = x;

tensC[ i ].y = y;

tensC[ i ].z = z;

tensC[ i ].h = h;

tensC[ i ].v = v;

}//for i

//頂点の位置を計算済み



//描画

for( var i = 0; i < mens.length; i++ ) {

var men = mens[ i ];


//面を構成する点を順にたどる

canvas.beginPath();

for( var j = 0; j < men.length; j++ ) {

var tenIDX = men[ j ];

var ten = tensC[ tenIDX ];


var h = ten.h;

var v = ten.v;


//最初の点はmoveTo、続く点はlineTo

if( j == 0 ) {

canvas.moveTo( screenW / 2 + h, screenH / 2 + v );

} else {

canvas.lineTo( screenW / 2 + h, screenH / 2 + v );

}

}

canvas.closePath();


//面の線を描く

canvas.strokeStyle = "black";

canvas.stroke();

}

}

</script>

<style>

</style>

</head>

<body onload="onloadx();" style="

background-color : lightgray;

height : 100%;

margin : 0;

">

<canvas id="canvasELID" width="512" height="448" style="

display : block;

margin : auto;

background-color : white;

border : solid 1px black;

">There is no canvas.</canvas>

</body>

</html>


下に掲載している「プログラムリスト表示機能」の処理時間
ユーザ時間:0.016秒 / システム時間:0.000秒 / 子プロセスユーザ時間:0.000秒 / 子プロセスシステム時間:0.008秒
<html>

<head>

<meta content="text/html; charset=UTF-8" http-equiv="content-type">

<title>untitled canvas</title>

<script>

console.log( "=============== script ==============" );

/*

『原理を使用した3DCG - 基本プログラム』


実行すると、正六面体の面の前後関係が正しく描かれる。

(「画家のアルゴリズム」で陰面消去される)



3DCG仕様:

Z軸は奥へ行くほど増加し、手前に来るほど減少する。



*/

function $( id ) { return document.getElementById( id ); }

var HereDocument = /\/\*\s*([^]*?)\s*\*\//;

var canvasEL, canvas;


function onloadx() {

canvasEL = $( "canvasELID" );

canvas = canvasEL.getContext( '2d' );

screenW = canvasEL.width;

screenH = canvasEL.height;


//(canvasSpecial resize / crisp low)


//正六面体の頂点(中心を原点としたときの位置)

tens = [

{ x : -1, y : -1, z : -1 }, //0: 左下 手前

{ x : +1, y : -1, z : -1 }, //1: 右下 手前

{ x : +1, y : +1, z : -1 }, //2: 右上 手前

{ x : -1, y : +1, z : -1 }, //3: 左上 手前


{ x : -1, y : -1, z : +1 }, //4: 左下 奥

{ x : +1, y : -1, z : +1 }, //5: 右下 奥

{ x : +1, y : +1, z : +1 }, //6: 右上 奥

{ x : -1, y : +1, z : +1 }, //7: 左上 奥

];


mens = [

[ 3, 2, 1, 0 ], //向かって正面

[ 1, 2, 6, 5 ], //向かって右面

[ 0, 4, 7, 3 ], //向かって左面

[ 7, 6, 2, 3 ], //向かって上面

[ 0, 1, 5, 4 ], //向かって下面

[ 5, 6, 7, 4 ], //向かって背面

]; //※各面の点の並びは時計回り


//正六面体の拡大

scale = 10;


//正六面体の位置

posX = 0;

posY = 0;

posZ = 80;


//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)

s = 50;


draw();

}

function draw() {


//頂点の位置を計算

var tensC = new Array();

for( var i = 0; i < tens.length; i++ ) {

var x = tens[ i ].x;

var y = tens[ i ].y;

var z = tens[ i ].z;


//scale倍

x *= scale;

y *= scale;

z *= scale;


//位置へ移動

x += posX;

y += posY;

z += posZ;


//3Dの座標を2Dの座標に変換する

var h = x * ( s / z );

var v = -y * ( s / z );


//画面を引き延ばし

h *= 14.25;

v *= 14.25;


//値を保管

tensC[ i ] = new Object();

tensC[ i ].x = x;

tensC[ i ].y = y;

tensC[ i ].z = z;

tensC[ i ].h = h;

tensC[ i ].v = v;

}//for i

//頂点の位置を計算済み



//面の配列を作成する

var allmens = new Array();

for( var j = 0; j < mens.length; j++ ) {

var men = mens[ j ];


//面を構成する点を順にたどる

var sumZ = 0;

for( var k = 0; k < men.length; k++ ) {

var tenIDX = men[ k ];

var ten = tensC[ tenIDX ];

sumZ += ten.z;

}


//allmensへ追加する

var theMen = new Object();

theMen.men = men;

theMen.avgZ = sumZ / men.length;

allmens.push( theMen );

}//for j



//すべての面を奥から手前の順にソート

//(陰面消去1 「画家のアルゴリズム」)

allmens.sort( function( a, b ) {

if( a.avgZ > b.avgZ ) return -1;

else if( a.avgZ < b.avgZ ) return 1;

else return 0;

} );



//描画

for( var i = 0; i < allmens.length; i++ ) {

var men = allmens[ i ].men;


//面を構成する点を順にたどる

canvas.beginPath();

for( var j = 0; j < men.length; j++ ) {

var tenIDX = men[ j ];

var ten = tensC[ tenIDX ];


var h = ten.h;

var v = ten.v;


//最初の点はmoveTo、続く点はlineTo

if( j == 0 ) {

canvas.moveTo( screenW / 2 + h, screenH / 2 + v );

} else {

canvas.lineTo( screenW / 2 + h, screenH / 2 + v );

}

}

canvas.closePath();


//面の中を塗る

canvas.fillStyle = "RGBA(196, 196, 0, 0.75)";

canvas.fill();


//面の線を描く

canvas.strokeStyle = "black";

canvas.stroke();

}

}

</script>

<style>

</style>

</head>

<body onload="onloadx();" style="

background-color : lightgray;

height : 100%;

margin : 0;

">

<canvas id="canvasELID" width="512" height="448" style="

display : block;

margin : auto;

background-color : white;

border : solid 1px black;

">There is no canvas.</canvas>

</body>

</html>


下に掲載している「プログラムリスト表示機能」の処理時間
ユーザ時間:0.016秒 / システム時間:0.008秒 / 子プロセスユーザ時間:0.000秒 / 子プロセスシステム時間:0.000秒
<html>

<head>

<meta content="text/html; charset=UTF-8" http-equiv="content-type">

<title>untitled canvas</title>

<script>

console.log( "=============== script ==============" );

/*

『原理を使用した3DCG - 基本プログラム』


実行すると、こちら(視点の方向)を向いていない面は描画が省略されて、

正六面体が描かれる。

(「法線ベクトル法」で陰面消去される)



3DCG仕様:

Z軸は奥へ行くほど増加し、手前に来るほど減少する。


*/

function $( id ) { return document.getElementById( id ); }

var HereDocument = /\/\*\s*([^]*?)\s*\*\//;

var canvasEL, canvas;


function onloadx() {

canvasEL = $( "canvasELID" );

canvas = canvasEL.getContext( '2d' );

screenW = canvasEL.width;

screenH = canvasEL.height;


//(canvasSpecial resize / crisp low)


//正六面体の頂点(中心を原点としたときの位置)

tens = [

{ x : -1, y : -1, z : -1 }, //0: 左下 手前

{ x : +1, y : -1, z : -1 }, //1: 右下 手前

{ x : +1, y : +1, z : -1 }, //2: 右上 手前

{ x : -1, y : +1, z : -1 }, //3: 左上 手前


{ x : -1, y : -1, z : +1 }, //4: 左下 奥

{ x : +1, y : -1, z : +1 }, //5: 右下 奥

{ x : +1, y : +1, z : +1 }, //6: 右上 奥

{ x : -1, y : +1, z : +1 }, //7: 左上 奥

];


mens = [

[ 3, 2, 1, 0 ], //向かって正面

[ 1, 2, 6, 5 ], //向かって右面

[ 0, 4, 7, 3 ], //向かって左面

[ 7, 6, 2, 3 ], //向かって上面

[ 0, 1, 5, 4 ], //向かって下面

[ 5, 6, 7, 4 ], //向かって背面

]; //※各面の点の並びは時計回り


//正六面体の拡大

scale = 10;


//正六面体の位置

posX = 0;

posY = 0;

posZ = 80;


//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)

s = 50;


draw();

}

function draw() {


//頂点の位置を計算

var tensC = new Array();

for( var i = 0; i < tens.length; i++ ) {

var x = tens[ i ].x;

var y = tens[ i ].y;

var z = tens[ i ].z;


//scale倍

x *= scale;

y *= scale;

z *= scale;


//位置へ移動

x += posX;

y += posY;

z += posZ;


//3Dの座標を2Dの座標に変換する

var h = x * ( s / z );

var v = -y * ( s / z );


//画面を引き延ばし

h *= 14.25;

v *= 14.25;


//値を保管

tensC[ i ] = new Object();

tensC[ i ].x = x;

tensC[ i ].y = y;

tensC[ i ].z = z;

tensC[ i ].h = h;

tensC[ i ].v = v;

}//for i

//頂点の位置を計算済み



//面の配列を作成する

var allmens = new Array();

for( var j = 0; j < mens.length; j++ ) {

var men = mens[ j ];


//check. 面が視点のほうを向いていないなら、その面は除去

var tmpTens = new Array();

for( var i = 0; i < men.length; i++ )

tmpTens.push( tensC[ men[ i ] ] );


if( ! checkVisibility( tmpTens ) ) continue;


//面を構成する点を順にたどる

var sumZ = 0;

for( var k = 0; k < men.length; k++ ) {

var tenIDX = men[ k ];

var ten = tensC[ tenIDX ];

sumZ += ten.z;

}


//allmensへ追加する

var theMen = new Object();

theMen.men = men;

theMen.avgZ = sumZ / men.length;

allmens.push( theMen );

}//for j



//すべての面を奥から手前の順にソート

//(陰面消去1 「画家のアルゴリズム」)

allmens.sort( function( a, b ) {

if( a.avgZ > b.avgZ ) return -1;

else if( a.avgZ < b.avgZ ) return 1;

else return 0;

} );



//描画

for( var i = 0; i < allmens.length; i++ ) {

var men = allmens[ i ].men;


//面を構成する点を順にたどる

canvas.beginPath();

for( var j = 0; j < men.length; j++ ) {

var tenIDX = men[ j ];

var ten = tensC[ tenIDX ];


var h = ten.h;

var v = ten.v;


//最初の点はmoveTo、続く点はlineTo

if( j == 0 ) {

canvas.moveTo( screenW / 2 + h, screenH / 2 + v );

} else {

canvas.lineTo( screenW / 2 + h, screenH / 2 + v );

}

}

canvas.closePath();


//面の中を塗る

canvas.fillStyle = "RGBA(196, 196, 0, 0.75)";

canvas.fill();


//面の線を描く

canvas.strokeStyle = "black";

canvas.stroke();

}

}


//---その他関数


function checkVisibility( p ) {

var x1 = p[ 0 ].x, y1 = p[ 0 ].y, z1 = p[ 0 ].z;

var x2 = p[ 1 ].x, y2 = p[ 1 ].y, z2 = p[ 1 ].z;

var x3 = p[ 2 ].x, y3 = p[ 2 ].y, z3 = p[ 2 ].z;


//法線(housen)

var hx = (y2-y1)*(z3-z2)-(z2-z1)*(y3-y2);

var hy = (z2-z1)*(x3-x2)-(x2-x1)*(z3-z2);

var hz = (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2);


//視点の方向(eye)

var ex = 0, ey = 0, ez = 0;

//重心(各成分の平均値)を計算している

for( var i = 0; i < p.length; i++ ) {

ex += p[ i ].x;

ey += p[ i ].y;

ez += p[ i ].z;

}

ex /= -p.length;

ey /= -p.length;

ez /= -p.length;


//法線と視点方向の内積(※cosθ)

var a = ex * hx + ey * hy + ez * hz;


return a > 0;

}


</script>

<style>

</style>

</head>

<body onload="onloadx();" style="

background-color : lightgray;

height : 100%;

margin : 0;

">

<canvas id="canvasELID" width="512" height="448" style="

display : block;

margin : auto;

background-color : white;

border : solid 1px black;

">There is no canvas.</canvas>

</body>

</html>


下に掲載している「プログラムリスト表示機能」の処理時間
ユーザ時間:0.023秒 / システム時間:0.000秒 / 子プロセスユーザ時間:0.000秒 / 子プロセスシステム時間:0.000秒
<html>

<head>

<meta content="text/html; charset=UTF-8" http-equiv="content-type">

<title>untitled canvas</title>

<script>

console.log( "=============== script ==============" );

/*

『原理を使用した3DCG - 基本プログラム』


実行すると、正六面体が回転されて描かれる。



3DCG仕様:

Z軸は奥へ行くほど増加し、手前に来るほど減少する。




*/

function $( id ) { return document.getElementById( id ); }

var HereDocument = /\/\*\s*([^]*?)\s*\*\//;

var canvasEL, canvas;


function onloadx() {

canvasEL = $( "canvasELID" );

canvas = canvasEL.getContext( '2d' );

screenW = canvasEL.width;

screenH = canvasEL.height;


//(canvasSpecial resize / crisp low)


//正六面体の頂点(中心を原点としたときの位置)

tens = [

{ x : -1, y : -1, z : -1 }, //0: 左下 手前

{ x : +1, y : -1, z : -1 }, //1: 右下 手前

{ x : +1, y : +1, z : -1 }, //2: 右上 手前

{ x : -1, y : +1, z : -1 }, //3: 左上 手前


{ x : -1, y : -1, z : +1 }, //4: 左下 奥

{ x : +1, y : -1, z : +1 }, //5: 右下 奥

{ x : +1, y : +1, z : +1 }, //6: 右上 奥

{ x : -1, y : +1, z : +1 }, //7: 左上 奥

];


mens = [

[ 3, 2, 1, 0 ], //向かって正面

[ 1, 2, 6, 5 ], //向かって右面

[ 0, 4, 7, 3 ], //向かって左面

[ 7, 6, 2, 3 ], //向かって上面

[ 0, 1, 5, 4 ], //向かって下面

[ 5, 6, 7, 4 ], //向かって背面

]; //※各面の点の並びは時計回り


//正六面体の拡大

scale = 10;


//正六面体の位置

posX = 0;

posY = 0;

posZ = 80;


//正六面体の回転

kaitenH = 3.14 / 4;

kaitenV = 3.14 / 8;


//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)

s = 50;


draw();

}

function draw() {


//頂点の位置を計算

var tensC = new Array();

for( var i = 0; i < tens.length; i++ ) {

var x = tens[ i ].x;

var y = tens[ i ].y;

var z = tens[ i ].z;


//scale倍

x *= scale;

y *= scale;

z *= scale;


//回転

var res = kaiten( x, z, kaitenH );

x = res.X;

z = res.Y;


var res = kaiten( z, y, kaitenV );

z = res.X;

y = res.Y;


//位置へ移動

x += posX;

y += posY;

z += posZ;


//3Dの座標を2Dの座標に変換する

var h = x * ( s / z );

var v = -y * ( s / z );


//画面を引き延ばし

h *= 14.25;

v *= 14.25;


//値を保管

tensC[ i ] = new Object();

tensC[ i ].x = x;

tensC[ i ].y = y;

tensC[ i ].z = z;

tensC[ i ].h = h;

tensC[ i ].v = v;

}//for i

//頂点の位置を計算済み



//面の配列を作成する

var allmens = new Array();

for( var j = 0; j < mens.length; j++ ) {

var men = mens[ j ];


//check. 面が視点のほうを向いていないなら、その面は除去

var tmpTens = new Array();

for( var i = 0; i < men.length; i++ )

tmpTens.push( tensC[ men[ i ] ] );


if( ! checkVisibility( tmpTens ) ) continue;


//面を構成する点を順にたどる

var sumZ = 0;

for( var k = 0; k < men.length; k++ ) {

var tenIDX = men[ k ];

var ten = tensC[ tenIDX ];

sumZ += ten.z;

}


//allmensへ追加する

var theMen = new Object();

theMen.men = men;

theMen.avgZ = sumZ / men.length;

allmens.push( theMen );

}//for j



//すべての面を奥から手前の順にソート

//(陰面消去1 「画家のアルゴリズム」)

allmens.sort( function( a, b ) {

if( a.avgZ > b.avgZ ) return -1;

else if( a.avgZ < b.avgZ ) return 1;

else return 0;

} );



//描画

for( var i = 0; i < allmens.length; i++ ) {

var men = allmens[ i ].men;


//面を構成する点を順にたどる

canvas.beginPath();

for( var j = 0; j < men.length; j++ ) {

var tenIDX = men[ j ];

var ten = tensC[ tenIDX ];


var h = ten.h;

var v = ten.v;


//最初の点はmoveTo、続く点はlineTo

if( j == 0 ) {

canvas.moveTo( screenW / 2 + h, screenH / 2 + v );

} else {

canvas.lineTo( screenW / 2 + h, screenH / 2 + v );

}

}

canvas.closePath();


//面の中を塗る

canvas.fillStyle = "RGBA(196, 196, 0, 0.75)";

canvas.fill();


//面の線を描く

canvas.strokeStyle = "black";

canvas.stroke();

}

}


//---その他関数


function checkVisibility( p ) {

var x1 = p[ 0 ].x, y1 = p[ 0 ].y, z1 = p[ 0 ].z;

var x2 = p[ 1 ].x, y2 = p[ 1 ].y, z2 = p[ 1 ].z;

var x3 = p[ 2 ].x, y3 = p[ 2 ].y, z3 = p[ 2 ].z;


//法線(housen)

var hx = (y2-y1)*(z3-z2)-(z2-z1)*(y3-y2);

var hy = (z2-z1)*(x3-x2)-(x2-x1)*(z3-z2);

var hz = (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2);


//視点の方向(eye)

var ex = 0, ey = 0, ez = 0;

//重心(各成分の平均値)を計算している

for( var i = 0; i < p.length; i++ ) {

ex += p[ i ].x;

ey += p[ i ].y;

ez += p[ i ].z;

}

ex /= -p.length;

ey /= -p.length;

ez /= -p.length;


//法線と視点方向の内積(※cosθ)

var a = ex * hx + ey * hy + ez * hz;


return a > 0;

}


function kaiten( x, y, theta2 ) {

/*

数学分野の汎用関数

原点を中心にして、回転する

*/

var theta1 = Math.atan2( y, x );

var hankei = Math.sqrt( x * x + y * y );

var kaitenX = Math.cos( theta1 + theta2 ) * hankei;

var kaitenY = Math.sin( theta1 + theta2 ) * hankei;

return { X : kaitenX, Y : kaitenY };

}


</script>

<style>

</style>

</head>

<body onload="onloadx();" style="

background-color : lightgray;

height : 100%;

margin : 0;

">

<canvas id="canvasELID" width="512" height="448" style="

display : block;

margin : auto;

background-color : white;

border : solid 1px black;

">There is no canvas.</canvas>

</body>

</html>



ファイルの比較を行うための「diff」 コマンド(リンクは Wikipedia 当該ページへ)の出力結果をもとにしています。

diff コマンドは UNIX のコマンドの1つです。(正確には、ここで使ったのは、Unix 風のオペレーティングシステム FreeBSD の diff コマンドです)


みなさんがこの Web ページをブラウザから呼び出すと次のような流れでこの diff コマンドが実行されます。

ブラウザ インターネット 上のWEBサーバー サーバー上の perl スクリプト 「プログラムリ ストの表示機能」の別スクリプトファイル

最後の「プログラムリストの表示機能」の別スクリプトファイル、の途中で以下のような文を実行しています。

my $diffcmd = $nettype eq 'local' ? "D:\\ProgramByInstaller\\FPC\\bin\\i386-win32\\diff.exe" : "diff";
$diffres = join( '', readpipe( $diffcmd." -b \"$file2FSYS\" \"$pathFSYS\"" ) );

この 1 行目は、”ネットがローカル(私の PC 上の開発用のウェブサーバー)であれば、私のパソコン上の diff.exe を使い、そうでなければ(インターネット上なら)サーバーの diff コマンドを使う”、という内容です。なお、$nettype という変数は事前に私が自前で設定したものです。

2行目は、子プロセスでコマンドを実行しますが、出力結果がほしいので、perl の readpipe という命令を使って、出力結果の各行を得て、1 つの文字列にまとめています。


diff コマンドが使えるかどうか確認する - 「ホームページ領域サービス」に tera-term でアクセス

自分が契約している「ホームページ領域サービス」で diff コマンドが使えるのかどうかは、CGI スクリプトファイルでそのコマンドを実行するようにすればわかりますが、それだと勝手が悪いです。

MS-DOS みたいに コマンドプロンプトからいろいろ作業する方法がありますので、その方法をちょっと紹介 します。


「ホームページ領域サービス」で FTP サーバーの ID や パスワードを発行してもらっているなら、次の方法でコマンドプロンプトを表示できると思います。

必要なもの:

  • tera-term(フリーウェアです。リンクは窓の杜の当該ページです)
  • 「ホームページ領域サービス」で発行された次の情報が必要です。
    FTP サーバーのアド レス たと えば、web6047.sakura.ne.jp のような文字列です。
    FTP サーバーの ID たと えば、web6047 のような文字列です。
    その パス ワード これ は「ホームページ領域サービス」で発行された複雑な文字列です。
    (場合によっては自分で変更しているかもしれません)

   

  1. tera-term を起動します。
    すると、新しい接続 ウィンドウが表示されます。

    上図のように、TCP/IP を選択した状態で、ホスト の欄に、「ホームページ領域サービス」で発行された FTP サーバーの アドレス を入力します。

    そして、その他の設定を確認します。
    サー ビス SSH
    TCP ポート 22
    SSH バージョン SSH2
    プロトコル UNSPEC

    確認したら、OK ボタンを押します。
  2. すると、SSH認証 ウィンドウが開きます。
    認証が必要です. と表示されています。
    「ホームページ領域サービス」で発行された FTP サーバーの ID と パスフレーズ(パスワード) を入力し、OK ボタンを押します。
  3. Welcome to FreeBSD! と表示されれば OK!
    コマンドを打ち込んで、操作できます。
  4. diff コマンドを打ち込んでみます。


    英語で、
    diff: `diff 'の後にオペランドがありません
    diff:詳細については、 `diff --help 'を試してください。
    と表示されています。
    diff コマンドが使えるということです。

    そして、私の「ホームページ領域サービス」では、すでにファイルを置いてあるので、下図のように入力すると…


    このように、diff コマンドの結果が出力されます。


    10a11
    > …
    という出力は、古いファイルの10行目にappend(追加)され、新しいファイルの11行目に対応している。
    その行は…、という意味です。

    今回の perl スクリプト「プログラムリスト表示機能」では、perlの命令のreadpipeでこのdiffコマンドの出力を読み取り、解析しています。

    ところで、上図では日本語を普通に使っていますが、場合によっては文字化けすることがあります。
  5. 日本語を表示できるようにするには

    ご注意:
    少し難しいことをやっているので、自信が無い方はいじらないほうが無難です。
    「設定がズレてしまって、動きがおかしくなり、元に戻せない!」という事態になってあわてたくない人は、次の手順は行わないほうが良いで す。


    tera-term でログインして、コマンドプロンプトに日本語を入力してみます。


    あいうえお と入力したのに、下図のように文字化けしてしまうなら、日本語の設定になっていません。


    「FFFTP」など FTP ソフトを起動し、「ホームページ領域サービス」の FTP サーバーにアクセスします。
    (これは日ごろから行っている作業だと思います)


    自分の領域の一番上のディレクトリに、上図のように「.login_conf」というファイルがあるので、自分のパソコンへダウンロードしま す。

    ダウンロードしたら、テキストエディタで開きます。
    すると、たいてい、このようになっていると思います。
    #で始まる行はコメントです。


    上図を下図のように変更します。
    もともとの設定を、行頭に # を入れてコメントアウトして、新しく設定を記入します。


    変更したテキストファイル「.login_conf」をもとの場所にアップロードして、tera-term で接続しなおすと、日本語が使えるようになっています。


    もし、元に戻したいときは、「.login_conf」の新しい設定を削除して、元の設定の行頭の # を削除して、元の場所にアップロードすれば元に戻ります。

2022/1/1(土)

初日の出

珍しく初日の出を見に行きました。

日の出は 6 時 48 分の予定でしたが、写真のとおり、雲がかかっていたので、7 時丁度くらいに見えました。

「なるほど、これか!」と思って初日の出の価値がコレなんだと知りました。

「きれいだなぁ」と思いました。

でも、”初日の出だからキレイなのか?” といつもの調子で思っちゃいました。

初日の出といっても、毎日の日の出と物理的に何が違うかというと、特に違いはないはずです…。

毎日この時間に散歩で浜辺を歩いている人にとっては、この写真の日の出は「いつもの日の出」に見えるはずで、きれいはきれいなんだけど、いつも と同じ、に見えるんじゃないかな。

いつもの話ですが、年代物の高級なワインよりも、その辺のスーパーで売っている 400 円くらいのワインのほうがよっぽどおいしい、という話を昔、テレビの何かの特集で聞いたことがあります。ペラペラの紙に金額を書いて「おさつ」として価値を設定したからこ そ、みんな「ほしい!!」と言うのであって、物理的には単なるペラペラの紙です。遊戯王のトレーディングカードや、WCCF のサッカー選手のカード、ポケモンのチップ。人間が価値を定めて、たかがカードやプラスチックのチップに 10 万円以上の価値を設定することがあります。ポケモンのカード対戦の全国大会で優勝した者だけに与えられるポケモンモンスターのチップは 13 万円とかの値が付いていました。

でも大事なんですよね。大切な思い入れのあるものなので、ちゃんとわかってあげなきゃいけないんです。

小学生が遊戯王のカードを買い取りの私のレジ(昔の私の仕事)に来たときは、そう思いました。

たとえ価値のないカードであっても、「とてもきれいにしてある良いカードだと思うんだけど、買取価格は…こうなっちゃうよ?」

価値のないカードの買取価格は 10 円だったか…30 枚持って来ても 300 円。いや、1枚 5 円で 150 円とかだったような。

テレビ番組のお宝探偵団の鑑定士の人が最後に、「でも、とても美しい綺麗なカケジクだと思います。大切になさってください」と言いますよね。 きっと同じ気持ちなんだと思います。グローバルな(人々全体としての)見方では価値がなくても、ローカルな(個人や少人数グループとしての)見方 では確かに価値があるんです。

人間がそれに対して思う価値は確かにそこにある。

人が初日の出に対して思う価値は確かにそこにある。


ちなみに、上の写真は浜辺から 25m 上のほうの場所でして、下のほうの浜辺の様子は下の写真です。

上も下も人でいっぱいでした。

家に帰ると(写真の場所から5分)、氷点下だったせいで、手が凍傷になるんじゃないかと思うくらい痛くなってしまい、しばらくヒーターの前から 動けませんでした。


謹賀新年

あけましておめでとうございます。今年もよろしくお願いいたします。


年賀状は仕事が忙しいとか、趣味が忙しいとかで、最近は書けなくなってしまいました。

あらかじめ何か絵が印刷してある年賀状を買って、ちょっとメッセージを書いて送ればそれで良いはずなんですけど、私はそうではなくて、白い何も 印刷されていない年賀状にしっかりと私の絵を描いて送らないと気が済まない、、みたいなところがあるんです。だから時間が無いなら書けないな、送 れないなということになってしまいます。


(訪問者のどんなニーズと この記事がつながるか)

  • 日記を読みたい